; CPUID Test function
BITS 64

global TestCpuid
section .text

TestCpuid:
    ; 保存寄存器
    push rbx
    push rcx
    push rdx
    
    ; 调用CPUID获取虚拟机监控程序信息
    mov rax, 0x40000000    ; Hypervisor CPUID leaf
    cpuid                  ; 执行CPUID指令
    
    ; 检查返回值
    ; RAX应该返回 0x40000001
    cmp rax, 0x40000001
    jne not_minivisor
    
    ; RBX应该返回 "Mini" (0x4D696E69)
    cmp rbx, 0x4D696E69
    jne not_minivisor
    
    ; RCX应该返回 "Viso" (0x5669736F)
    cmp rcx, 0x5669736F
    jne not_minivisor
    
    ; RDX应该返回 "rP2-" (0x7250322D)
    cmp rdx, 0x7250322D
    jne not_minivisor
    
    ; 如果所有检查都通过，返回1
    mov rax, 1
    jmp exit_test
    
not_minivisor:
    ; 如果任何检查失败，返回0
    xor rax, rax
    
exit_test:
    ; 恢复寄存器
    pop rdx
    pop rcx
    pop rbx
    ret

section .data
    align 8
    signature_mini   db "Mini",0
    signature_viso   db "Viso",0
    signature_rp2    db "rP2-",0